#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define TASK_NUM 10//任务个数

//模拟预设一批任务
void sync_disk(){
	printf("这是刷新数据的任务!\n");
}
void sync_log(){
	printf("这是同步数据的任务!\n");
}
void net_send(){
	printf("这是网络发送的任务!\n");
}

//函数指针
typedef void (*func_t)();//typedef void (*func_t)(); == typedef void (*)() func_t;

//任务列表
func_t other_task[TASK_NUM] = {NULL};

//载入任务
int LoadTask(func_t func)
{
	int i = 0;
	for(i; i < TASK_NUM; i++)
	{
		if(other_task[i] == NULL)
		{
			break;
		}
	}

	if(i == TASK_NUM)//任务加载满了
	{
		return -1;
	}
	else//可以加载任务
	{
		other_task[i] = func;
	}

    return 0;
}

//初始化任务
void InitTask()
{
	int i;
	for(i = 0; i < TASK_NUM; i++)
	{
		other_task[i] = NULL;
	}
	//载入三个任务
	LoadTask(sync_disk);
	LoadTask(sync_log);
	LoadTask(net_send);
}

//运行任务
void RunTask()
{
	int i;
	for(i = 0; i < TASK_NUM; i++)
	{
		if(other_task[i] == NULL)
		{
			continue;
		}
		other_task[i]();
	}
}



int main()
{
    pid_t id = fork();
    if(id == 0)
    {
		//子进程
		int cnt = 5;
		while(cnt)
		{
	    	printf("这是子进程，子进程还没退出，还有%dS退出,pid:%d,ppid:%d\n", cnt--, getpid(), getppid());
	    	sleep(1);
		}
		exit(100);
    }
    //父进程

	InitTask();

    while(1)
    {
        int status = 0;
        pid_t ret_id = waitpid(id, &status, WNOHANG);
		if(ret_id < 0)
		{
	    	printf("waitpid error!\n");
	    	exit(1);
		}
		else if(ret_id == 0)
		{
	    	//子进程还未退出，父进程先去干别的
			RunTask();
	    	sleep(1);
	    	continue;
		}
		else
		{
			if(WIFEXITED(status))
			{
				printf("wait success, child exit code : %d\n", WEXITSTATUS(status));
			}
			else
			{
				printf("wait success, chile exit signal : %d\n", status&0x7F);
			}
        	//printf("这是父进程,等待子进程结束,pid:%d,ppid:%d, ret_id %d, child exit code:%d, child exit signal:%d\n", getpid(), getppid(), ret_id, (status>>8)&0xFF, status&0x7F);
	    	break;
		}
    }
}



//int ADD(int top)
//{
//    int sum = 0;
//    for(int i = 0; i <= top; i++)
//    {
//	sum += i;
//    }
//    return sum;
//}
//
//
//int main()
//{
//    printf("Hello world!");
//    sleep(1);
//   // exit(1);
//   //_exit(1);
//   // for(int i = 0; i < 200; i++)
//   // {
//   //     printf("%d : %s\n", i, strerror(i));
//   //     exit(123);
//   // }
////    int sum = ADD(100);
//    if(sum == 100)
//    {
//        return 0;
//    }   
//    else
//    {
//        return 1;
//    }
//}
